﻿using System;
using System.Collections.Generic;

using System.Text;

namespace Sinacor.Tools.Negocio
{
    public class TipoMensagem : NegocioBase<Sinacor.Tools.Entidade.TipoMensagem>
    {

        private Dado.TipoMensagem dados; 
        public override void incluir(Sinacor.Tools.Entidade.TipoMensagem entidade)
        {
            validaInclusao(entidade);
            lock (new object())
            {
                dados = new Dado.TipoMensagem();
                if (JaEstaCadastrado(entidade))
                    throw new Exception("Ja existe esta descrição cadastrada!");
                entidade.Id = this.buscarProximoId();
                dados.incluir(entidade);
            }
        }

        public override void alterar(Sinacor.Tools.Entidade.TipoMensagem entidade)
        {
            validaAlteracao(entidade);
            dados = new Dado.TipoMensagem();
            dados.alterar(entidade);
        }

        public override void deletar(Sinacor.Tools.Entidade.TipoMensagem entidade)
        {
            this.validaDelecao(entidade);
            if (this.jaPossuiMensagem(entidade))
                throw new Exception("Não é possível deletar este tipo, ele ja possui mensagem(ns) vinculada(s)!");
            
            dados = new Dado.TipoMensagem();
            dados.deletar(entidade);
        }

        public override List<Sinacor.Tools.Entidade.TipoMensagem> consultar(Sinacor.Tools.Entidade.TipoMensagem entidade)
        {
            dados = new Dado.TipoMensagem();
            List<Sinacor.Tools.Entidade.TipoMensagem> lista = dados.consultar(entidade);
            lista.RemoveAt(lista.Count-1); // Remove o elemento "NÃO UTILIZAR" 
            lista.Sort(entidade);
            return lista;
        }

        protected void validaInclusao(Sinacor.Tools.Entidade.TipoMensagem entidade)
        {
            if (string.IsNullOrEmpty(entidade.Descricao))
            {
                throw new Exception("Campo Descrição obrigatório!");
            }
        }


        protected void validaDelecao(Sinacor.Tools.Entidade.TipoMensagem entidade)
        {
            if (entidade.Id == null || entidade.Id < 0)
                throw new Exception("Campo Código obrigatório para deleção!");
        }

        protected void validaAlteracao(Sinacor.Tools.Entidade.TipoMensagem entidade)
        {
            string mensagem = string.Empty;
            if (entidade.Id <= 0 || entidade.Id == null)
            {
                mensagem += "Campo Código obrigatório!" + Environment.NewLine;
            }


            if (string.IsNullOrEmpty(entidade.Descricao))
            {
                mensagem += "Campo Descrição obrigatório!" + Environment.NewLine;
            }

            if (mensagem != string.Empty)
                throw new Exception(mensagem);
        }

        public void salvar(Sinacor.Tools.Entidade.TipoMensagem entidade)
        {
            if (entidade.Id >= 0)
            {
                this.alterar(entidade);
            }
            else
            {
                this.incluir(entidade);
            }
        }

        public byte buscarProximoId()
        {
            object proximoId;
            dados = new Dado.TipoMensagem();
            proximoId = dados.buscarProximoId();
            if (proximoId == null)
                proximoId = 1;

            return Convert.ToByte(proximoId);            
        }

        public bool JaEstaCadastrado(Sinacor.Tools.Entidade.TipoMensagem entidade)
        {
            dados = new Dado.TipoMensagem();
            return dados.JaEstaCadastrado(entidade) == null ? false : true;  
        }

        public bool jaPossuiMensagem(Sinacor.Tools.Entidade.TipoMensagem entidade)
        {
            dados = new Dado.TipoMensagem();
            return Convert.ToInt32(dados.jaPossuiMensagem(entidade)) == 0 ? false : true;
        }
            
    }
}
